""" while循环 """

# for 循环可以做的，while循环也可以做
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
index = 0
while index < len(l):
    print(l[index])
    index += 1

#适合场景：如果你需要在满足某个条件前，不停地重复某些操作，并且没有特定的集合需要去遍历，那么一般则会使用while循环。

while True:
    try:
        # 循环体
        user_input = input("请输入数字（输入'q'退出）：")
        if user_input == "q":
            print("退出程序")
            break
        else:
            number = int(user_input)
            print(f"你输入的数字是: {number}")
    except Exception as err:
        print(f"Exception error: {type(err).__name__}: {err}")
        break


''' 效率对比 '''
'''
同时需要注意的是，for循环和while循环的效率问题。比如下面的while循环：

i = 0
while i < 1000000:
    i += 1
和等价的for循环：

for i in range(0, 1000000):
    pass
究竟哪个效率高呢？

要知道，range()函数是直接由C语言写的，调用它速度非常快。而while循环中的“i += 1”这个操作，得通过Python的解释器间接调用底层的C语言；并且这个简单的操作，又涉及到了对象的创建和删除（因为i是整型，是immutable，i += 1相当于i = new int(i + 1)）。所以，显然，for循环的效率更胜一筹。
'''

""" Python 列表推导式语法(条件与循环的复用) """
# 这段代码是一个列表推导式（list comprehension），用于根据给定的列表 `x` 生成一个新的列表 `y`。让我们逐步解析这段代码：
x = [-2, -1, 0, 1, 2]
y = [value * 2 + 5 if value > 0 else -value * 2 + 5 for value in x]
print("列表y:{}".format(y))
### 代码解析
#这段代码的作用是根据列表 `x` 中的每个元素 `value`，应用不同的计算公式（取决于 `value` 是否大于 0），并生成一个新的列表 `y`。具体来说：
#- 如果 `value > 0`，则 `y[i] = value * 2 + 5`
#- 如果 `value <= 0`，则 `y[i] = -value * 2 + 5`

#当然，这样的复用并不仅仅局限于一个循环。比如，给定两个列表x、y，要求返回x、y中所有元素对组成的元组，相等情况除外。那么，你也可以很容易表示出来：
l = [(xx, yy) for xx in x for yy in y if xx != yy]
print("元组列表：{}".format(l))
#这样的写法就等价于：
l = []
for xx in x:
    for yy in y:
        if xx != yy:
            l.append((xx, yy))
print("元组列表：{}".format(l))
#语法一：条件过滤（Filtering）
# expression for item in iterable if condition
#语法二：条件赋值（Conditional Expression） 三元表达式
# expression1 if condition else expression2 for item in iterable
#熟练之后，你会发现这种写法非常方便。当然，如果遇到逻辑很复杂的复用，你可能会觉得写成一行难以理解、容易出错。那种情况下，用正常的形式表达，也不失为一种好的规范和选择。
